home *** CD-ROM | disk | FTP | other *** search
/ Freaks Macintosh Archive / Freaks Macintosh Archive.bin / Freaks Macintosh Archives / Hacking & Misc / UNIX Cracking / MacCracSource.sit / MacCrac.source / Source / crack-fcrypt.c < prev    next >
Text File  |  1996-02-01  |  25KB  |  912 lines

  1. /*
  2.  * This program is copyright Alec Muffett 1991 except for some portions of
  3.  * code in "crack-fcrypt.c" which are copyright Robert Baldwin, Icarus Sparry
  4.  * and Alec Muffett.  The author(s) disclaims all responsibility or liability
  5.  * with respect to it's usage or its effect upon hardware or computer
  6.  * systems, and maintain copyright as set out in the "LICENCE" document which
  7.  * accompanies distributions of Crack v4.0 and upwards.
  8.  */
  9.  
  10. /*
  11.  * Misc defs for the fast password transform optimisations.
  12.  */
  13.  
  14. #include "crack.h"
  15. #include <string.h>
  16.  
  17. #define    reg    register
  18. #define    uns    unsigned
  19. #define unsb    uns char
  20. #define    unsl    uns long
  21.  
  22. /*
  23.  * Types for the different ways to represent DES bit patterns.  Bits are
  24.  * always right justified within fields.  Bits which have lower indices in
  25.  * the NBS spec are stored in the vax bits with less significance (e.g., Bit
  26.  * 1 of NBS spec is stored in the bit with weight 2 ** 0 to the Vax.
  27.  */
  28.  
  29. #define    obpb1    unsb        /* One bit per byte. */
  30. #define sbpb6    unsb        /* Six bits per byte, 6 held. */
  31. #define sbpb6R    unsb        /* Six bits per byte Reversed order, 6 held. */
  32. #define    sbpb24    unsl        /* Six bits per byte, 24 held. */
  33. #define    ebpb24    unsl        /* Eight bits per bit, 24 held. */
  34. #define    fbpb4    unsb        /* Four bits per byte, 4 held. */
  35. #define    fbpb4R    unsb        /* Four bits per byte Reversed order, 4 held. */
  36.  
  37. /*
  38.  * The operation (6 * x) is often better optimised as this (for really
  39.  * braindead compilers) - AEM
  40.  */
  41.  
  42. #ifdef BRAINDEAD6
  43. #define SIX_TIMES(exprn)        (((exprn) << 2) + ((exprn) << 1))
  44. #else
  45. #define SIX_TIMES(exprn)        (6 * (exprn))
  46. #endif                /* BRAINDEAD6 */
  47.  
  48. /* DES transformation type... */
  49.  
  50. union SDATA
  51. {
  52.     sbpb24 b[2];
  53.     sbpb6 c[8];
  54. };
  55. #ifndef FDES_4BYTE        /* Thanks to Matt Bishop for this idea -AEM. */
  56. #define SIZEFIX        0
  57. #define INDIRECT(a,b)     (a)[b]
  58. #else
  59. #define SIZEFIX        2    /* "n" where 2^n == sizeof(sbpb24) */
  60. #define INDIRECT(a,b)     (*((sbpb24 *)(((unsigned char *) a) + (b))))
  61. #endif
  62.  
  63. /*
  64.  * These used to be rather slow and frequently used functions - AEM
  65.  */
  66.  
  67. #define TF_TO_SIXBIT(tf) \
  68.     (sbpb24)((tf & 077L) | \
  69.         ((tf & 07700L) << 2) | \
  70.         ((tf & 0770000L) << 4) | \
  71.         ((tf & 077000000L) << 6))
  72.  
  73. #define SIXBIT_TO_TF(sb) \
  74.     (ebpb24)((sb & 0x3fL) | \
  75.         ((sb & 0x3f00L) >> 2) | \
  76.         ((sb & 0x3f0000L) >> 4) | \
  77.         ((sb & 0x3f000000L) >> 6))
  78.  
  79. /*
  80.  * Data segment gathered into one place, try to keep this stuff long aligned
  81.  * - AEM
  82.  */
  83.  
  84. static char iobuf[16];
  85. static obpb1 crypt_block[72];    /* 72 is next multiple of 8 bytes after 66 */
  86. static sbpb24 KS[32];
  87. static sbpb24 S0H[64], S1H[64], S2H[64], S3H[64];
  88. static sbpb24 S4H[64], S5H[64], S6H[64], S7H[64];
  89. static sbpb24 S0L[64], S1L[64], S2L[64], S3L[64];
  90. static sbpb24 S4L[64], S5L[64], S6L[64], S7L[64];
  91. static sbpb24 out96[4];
  92.  
  93.  
  94. /*
  95.  * Start of the real thing
  96.  */
  97.  
  98. void
  99. fsetkey ()
  100. {
  101.     /*
  102.      * This used to be utterly horrendous. It still is, but it's much, much,
  103.      * smaller... (and quite a bit faster...) - AEM
  104.      */
  105.     static unsb KeyToKS[] =
  106.     {
  107.     9, 50, 33, 59, 48, 16, 32, 56, 1, 8, 18, 41, 2, 34, 25, 24,
  108.     43, 57, 58, 0, 35, 26, 17, 40, 21, 27, 38, 53, 36, 3, 46, 29,
  109.     4, 52, 22, 28, 60, 20, 37, 62, 14, 19, 44, 13, 12, 61, 54, 30,
  110.     1, 42, 25, 51, 40, 8, 24, 48, 58, 0, 10, 33, 59, 26, 17, 16,
  111.     35, 49, 50, 57, 56, 18, 9, 32, 13, 19, 30, 45, 28, 62, 38, 21,
  112.     27, 44, 14, 20, 52, 12, 29, 54, 6, 11, 36, 5, 4, 53, 46, 22,
  113.     50, 26, 9, 35, 24, 57, 8, 32, 42, 49, 59, 17, 43, 10, 1, 0,
  114.     48, 33, 34, 41, 40, 2, 58, 16, 60, 3, 14, 29, 12, 46, 22, 5,
  115.     11, 28, 61, 4, 36, 27, 13, 38, 53, 62, 20, 52, 19, 37, 30, 6,
  116.     34, 10, 58, 48, 8, 41, 57, 16, 26, 33, 43, 1, 56, 59, 50, 49,
  117.     32, 17, 18, 25, 24, 51, 42, 0, 44, 54, 61, 13, 27, 30, 6, 52,
  118.     62, 12, 45, 19, 20, 11, 60, 22, 37, 46, 4, 36, 3, 21, 14, 53,
  119.     18, 59, 42, 32, 57, 25, 41, 0, 10, 17, 56, 50, 40, 43, 34, 33,
  120.     16, 1, 2, 9, 8, 35, 26, 49, 28, 38, 45, 60, 11, 14, 53, 36,
  121.     46, 27, 29, 3, 4, 62, 44, 6, 21, 30, 19, 20, 54, 5, 61, 37,
  122.     2, 43, 26, 16, 41, 9, 25, 49, 59, 1, 40, 34, 24, 56, 18, 17,
  123.     0, 50, 51, 58, 57, 48, 10, 33, 12, 22, 29, 44, 62, 61, 37, 20,
  124.     30, 11, 13, 54, 19, 46, 28, 53, 5, 14, 3, 4, 38, 52, 45, 21,
  125.     51, 56, 10, 0, 25, 58, 9, 33, 43, 50, 24, 18, 8, 40, 2, 1,
  126.     49, 34, 35, 42, 41, 32, 59, 17, 27, 6, 13, 28, 46, 45, 21, 4,
  127.     14, 62, 60, 38, 3, 30, 12, 37, 52, 61, 54, 19, 22, 36, 29, 5,
  128.     35, 40, 59, 49, 9, 42, 58, 17, 56, 34, 8, 2, 57, 24, 51, 50,
  129.     33, 18, 48, 26, 25, 16, 43, 1, 11, 53, 60, 12, 30, 29, 5, 19,
  130.     61, 46, 44, 22, 54, 14, 27, 21, 36, 45, 38, 3, 6, 20, 13, 52,
  131.     56, 32, 51, 41, 1, 34, 50, 9, 48, 26, 0, 59, 49, 16, 43, 42,
  132.     25, 10, 40, 18, 17, 8, 35, 58, 3, 45, 52, 4, 22, 21, 60, 11,
  133.     53, 38, 36, 14, 46, 6, 19, 13, 28, 37, 30, 62, 61, 12, 5, 44,
  134.     40, 16, 35, 25, 50, 18, 34, 58, 32, 10, 49, 43, 33, 0, 56, 26,
  135.     9, 59, 24, 2, 1, 57, 48, 42, 54, 29, 36, 19, 6, 5, 44, 62,
  136.     37, 22, 20, 61, 30, 53, 3, 60, 12, 21, 14, 46, 45, 27, 52, 28,
  137.     24, 0, 48, 9, 34, 2, 18, 42, 16, 59, 33, 56, 17, 49, 40, 10,
  138.     58, 43, 8, 51, 50, 41, 32, 26, 38, 13, 20, 3, 53, 52, 28, 46,
  139.     21, 6, 4, 45, 14, 37, 54, 44, 27, 5, 61, 30, 29, 11, 36, 12,
  140.     8, 49, 32, 58, 18, 51, 2, 26, 0, 43, 17, 40, 1, 33, 24, 59,
  141.     42, 56, 57, 35, 34, 25, 16, 10, 22, 60, 4, 54, 37, 36, 12, 30,
  142.     5, 53, 19, 29, 61, 21, 38, 28, 11, 52, 45, 14, 13, 62, 20, 27,
  143.     57, 33, 16, 42, 2, 35, 51, 10, 49, 56, 1, 24, 50, 17, 8, 43,
  144.     26, 40, 41, 48, 18, 9, 0, 59, 6, 44, 19, 38, 21, 20, 27, 14,
  145.     52, 37, 3, 13, 45, 5, 22, 12, 62, 36, 29, 61, 60, 46, 4, 11,
  146.     41, 17, 0, 26, 51, 48, 35, 59, 33, 40, 50, 8, 34, 1, 57, 56,
  147.     10, 24, 25, 32, 2, 58, 49, 43, 53, 28, 3, 22, 5, 4, 11, 61,
  148.     36, 21, 54, 60, 29, 52, 6, 27, 46, 20, 13, 45, 44, 30, 19, 62,
  149.     25, 1, 49, 10, 35, 32, 48, 43, 17, 24, 34, 57, 18, 50, 41, 40,
  150.     59, 8, 9, 16, 51, 42, 33, 56, 37, 12, 54, 6, 52, 19, 62, 45,
  151.     20, 5, 38, 44, 13, 36, 53, 11, 30, 4, 60, 29, 28, 14, 3, 46,
  152.     17, 58, 41, 2, 56, 24, 40, 35, 9, 16, 26, 49, 10, 42, 33, 32,
  153.     51, 0, 1, 8, 43, 34, 25, 48, 29, 4, 46, 61, 44, 11, 54, 37,
  154.     12, 60, 30, 36, 5, 28, 45, 3, 22, 27, 52, 21, 20, 6, 62, 38
  155.     };
  156.  
  157.     reg int i;
  158.     reg unsigned long r;
  159.     reg unsb *k;
  160.  
  161.     k = KeyToKS;
  162.  
  163.     for (i = 0; i < 32; i++)
  164.     {
  165.     /* 16-bit tweaks suggested by cip_maz@fb6tcp.physik.uni-paderborn.de */
  166.     /* inlining speedup tweak suggested by tahorsley@csd.harris.com */
  167.     /* (strange addition compensates missing TF_TO_SIXBIT) */
  168.     r = (unsigned long) crypt_block[*(k++)];
  169.     r |= (unsigned long) crypt_block[*(k++)] << 1;
  170.     r |= (unsigned long) crypt_block[*(k++)] << 2;
  171.     r |= (unsigned long) crypt_block[*(k++)] << 3;
  172.     r |= (unsigned long) crypt_block[*(k++)] << 4;
  173.     r |= (unsigned long) crypt_block[*(k++)] << 5;
  174.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 6);
  175.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 7);
  176.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 8);
  177.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 9);
  178.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 10);
  179.     r |= (unsigned long) crypt_block[*(k++)] << (2 + 11);
  180.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 12);
  181.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 13);
  182.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 14);
  183.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 15);
  184.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 16);
  185.     r |= (unsigned long) crypt_block[*(k++)] << (4 + 17);
  186.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 18);
  187.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 19);
  188.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 20);
  189.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 21);
  190.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 22);
  191.     r |= (unsigned long) crypt_block[*(k++)] << (6 + 23);
  192.     KS[i] = r;
  193.     }
  194. }
  195.  
  196. void
  197. XForm (saltvalue)
  198.     sbpb24 saltvalue;
  199. {
  200. #define BIG_ENDIAN  /* Hans was here */
  201. #ifdef BIG_ENDIAN        /* Icarus Sparry, Bath - mod AEM */
  202. #define STEP --
  203. #define START &sdata.c[7]
  204. #define Dl sdata.b[1]
  205. #define Dh sdata.b[0]
  206. #else
  207. #ifdef LITTLE_ENDIAN
  208. #define STEP ++
  209. #define START &sdata.c[0]
  210. #define Dl sdata.b[0]
  211. #define Dh sdata.b[1]
  212. #endif
  213.     /* else error */
  214. #endif
  215.     union SDATA sdata;
  216.     reg sbpb24 Rl;
  217.     reg sbpb24 Rh;
  218.     reg sbpb24 Ll;
  219.     reg sbpb24 Lh;
  220.     reg sbpb6 *dp;
  221.     int loop;
  222.     int kloop;
  223.     sbpb24 *kp;
  224.     reg sbpb24 k;
  225. #ifdef FDES_8BYTE
  226.     reg sbpb24 tmpi;
  227. #endif                /* FDES_8BYTE */
  228.  
  229.     Ll = Lh = Rl = Rh = 0;
  230.  
  231.     for (loop = 25; loop--; /* nothing */ )
  232.     {
  233.     kp = KS;
  234.     for (kloop = 8; kloop--; /* nothing */ )
  235.     {
  236.         k = (Rl ^ Rh) & saltvalue;
  237. #ifndef FDES_8BYTE
  238.         Dl = (k ^ Rl ^ *kp++) << SIZEFIX;
  239.         Dh = (k ^ Rh ^ *kp++) << SIZEFIX;
  240. #else
  241.         /* hack to make things work better - matthew kaufman */
  242.         /* I haven't tried any of this - I don't have a cray... AEM */
  243.         tmpi = (k ^ Rl ^ *kp++);
  244.         sdata.c[3] = (tmpi >> 24) & 0x00ff;
  245.         sdata.c[2] = (tmpi >> 16) & 0x00ff;
  246.         sdata.c[1] = (tmpi >> 8) & 0x00ff;
  247.         sdata.c[0] = (tmpi) & 0x00ff;
  248.         tmpi = (k ^ Rh ^ *kp++);
  249.         sdata.c[7] = (tmpi >> 24) & 0x00ff;
  250.         sdata.c[6] = (tmpi >> 16) & 0x00ff;
  251.         sdata.c[5] = (tmpi >> 8) & 0x00ff;
  252.         sdata.c[4] = (tmpi) & 0x00ff;
  253. #endif                /* FDES_8BYTE */
  254.  
  255.         dp = START;
  256.         Lh ^= INDIRECT (S0H, *dp);
  257.         Ll ^= INDIRECT (S0L, *dp STEP);
  258.         Lh ^= INDIRECT (S1H, *dp);
  259.         Ll ^= INDIRECT (S1L, *dp STEP);
  260.         Lh ^= INDIRECT (S2H, *dp);
  261.         Ll ^= INDIRECT (S2L, *dp STEP);
  262.         Lh ^= INDIRECT (S3H, *dp);
  263.         Ll ^= INDIRECT (S3L, *dp STEP);
  264.         Lh ^= INDIRECT (S4H, *dp);
  265.         Ll ^= INDIRECT (S4L, *dp STEP);
  266.         Lh ^= INDIRECT (S5H, *dp);
  267.         Ll ^= INDIRECT (S5L, *dp STEP);
  268.         Lh ^= INDIRECT (S6H, *dp);
  269.         Ll ^= INDIRECT (S6L, *dp STEP);
  270.         Lh ^= INDIRECT (S7H, *dp);
  271.         Ll ^= INDIRECT (S7L, *dp STEP);
  272.  
  273.         k = (Ll ^ Lh) & saltvalue;
  274. #ifndef FDES_8BYTE
  275.         Dl = (k ^ Ll ^ *kp++) << SIZEFIX;
  276.         Dh = (k ^ Lh ^ *kp++) << SIZEFIX;
  277. #else
  278.         tmpi = (k ^ Ll ^ *kp++);
  279.         sdata.c[3] = (tmpi >> 24) & 0x00ff;
  280.         sdata.c[2] = (tmpi >> 16) & 0x00ff;
  281.         sdata.c[1] = (tmpi >> 8) & 0x00ff;
  282.         sdata.c[0] = (tmpi) & 0x00ff;
  283.         tmpi = (k ^ Lh ^ *kp++);
  284.         sdata.c[7] = (tmpi >> 24) & 0x00ff;
  285.         sdata.c[6] = (tmpi >> 16) & 0x00ff;
  286.         sdata.c[5] = (tmpi >> 8) & 0x00ff;
  287.         sdata.c[4] = (tmpi) & 0x00ff;
  288. #endif                /* FDES_8BYTE */
  289.  
  290.         dp = START;
  291.         Rh ^= INDIRECT (S0H, *dp);
  292.         Rl ^= INDIRECT (S0L, *dp STEP);
  293.         Rh ^= INDIRECT (S1H, *dp);
  294.         Rl ^= INDIRECT (S1L, *dp STEP);
  295.         Rh ^= INDIRECT (S2H, *dp);
  296.         Rl ^= INDIRECT (S2L, *dp STEP);
  297.         Rh ^= INDIRECT (S3H, *dp);
  298.         Rl ^= INDIRECT (S3L, *dp STEP);
  299.         Rh ^= INDIRECT (S4H, *dp);
  300.         Rl ^= INDIRECT (S4L, *dp STEP);
  301.         Rh ^= INDIRECT (S5H, *dp);
  302.         Rl ^= INDIRECT (S5L, *dp STEP);
  303.         Rh ^= INDIRECT (S6H, *dp);
  304.         Rl ^= INDIRECT (S6L, *dp STEP);
  305.         Rh ^= INDIRECT (S7H, *dp);
  306.         Rl ^= INDIRECT (S7L, *dp STEP);
  307.     }
  308.  
  309.     Ll ^= Rl;
  310.     Lh ^= Rh;
  311.     Rl ^= Ll;
  312.     Rh ^= Lh;
  313.     Ll ^= Rl;
  314.     Lh ^= Rh;
  315.     }
  316.  
  317.     /*
  318.      * for reasons that I cannot explain, if I insert the contents of the
  319.      * UnXForm function right HERE, making the tweaks as necessary to avoid
  320.      * using out96[] to pass data, I LOSE 30% of my speed.  I don't know why.
  321.      * Hence, I continue to use out96[]...
  322.      */
  323.     {
  324.     reg sbpb24 *qp;
  325.     qp = out96;
  326.     *qp++ = Ll;
  327.     *qp++ = Lh;
  328.     *qp++ = Rl;
  329.     *qp++ = Rh;
  330.     }
  331. }
  332.  
  333. void
  334. UnXForm ()
  335. {
  336.     reg sbpb24 Rl;
  337.     reg sbpb24 Rh;
  338.     reg sbpb24 Ll;
  339.     reg sbpb24 Lh;
  340.     reg obpb1 *ptr;
  341.     reg long int mask;
  342.     register long int *lip;
  343.  
  344.     Ll = SIXBIT_TO_TF (out96[0]);
  345.     Lh = SIXBIT_TO_TF (out96[1]);
  346.     Rl = SIXBIT_TO_TF (out96[2]);
  347.     Rh = SIXBIT_TO_TF (out96[3]);
  348.  
  349. #ifdef BUILTIN_CLEAR
  350.     lip = (long int *) crypt_block;
  351.     for (mask = (sizeof (crypt_block) / sizeof (long int)); mask--; /* - */ )
  352.     {
  353.     *(lip++) = 0L;
  354.     }
  355. #else                /* BUILTIN_CLEAR */
  356.   /*  bzero (crypt_block, 66); */
  357.     memset(crypt_block, 0, 66);
  358. #endif                /* BUILTIN_CLEAR */
  359.  
  360.     ptr = crypt_block;
  361.     mask = 0x000400L;
  362.     if (Rl & mask)
  363.     *ptr = 0x01;
  364.     ptr++;
  365.     if (Ll & mask)
  366.     *ptr = 0x01;
  367.     ptr++;
  368.     mask = 0x400000L;
  369.     if (Rl & mask)
  370.     *ptr = 0x01;
  371.     ptr++;
  372.     if (Ll & mask)
  373.     *ptr = 0x01;
  374.     ptr++;
  375.     mask = 0x000400L;
  376.     if (Rh & mask)
  377.     *ptr = 0x01;
  378.     ptr++;
  379.     if (Lh & mask)
  380.     *ptr = 0x01;
  381.     ptr++;
  382.     mask = 0x400000L;
  383.     if (Rh & mask)
  384.     *ptr = 0x01;
  385.     ptr++;
  386.     if (Lh & mask)
  387.     *ptr = 0x01;
  388.     ptr++;
  389.     mask = 0x000200L;
  390.     if (Rl & mask)
  391.     *ptr = 0x01;
  392.     ptr++;
  393.     if (Ll & mask)
  394.     *ptr = 0x01;
  395.     ptr++;
  396.     mask = 0x200000L;
  397.     if (Rl & mask)
  398.     *ptr = 0x01;
  399.     ptr++;
  400.     if (Ll & mask)
  401.     *ptr = 0x01;
  402.     ptr++;
  403.     mask = 0x000200L;
  404.     if (Rh & mask)
  405.     *ptr = 0x01;
  406.     ptr++;
  407.     if (Lh & mask)
  408.     *ptr = 0x01;
  409.     ptr++;
  410.     mask = 0x200000L;
  411.     if (Rh & mask)
  412.     *ptr = 0x01;
  413.     ptr++;
  414.     if (Lh & mask)
  415.     *ptr = 0x01;
  416.     ptr++;
  417.     mask = 0x000100L;
  418.     if (Rl & mask)
  419.     *ptr = 0x01;
  420.     ptr++;
  421.     if (Ll & mask)
  422.     *ptr = 0x01;
  423.     ptr++;
  424.     mask = 0x100000L;
  425.     if (Rl & mask)
  426.     *ptr = 0x01;
  427.     ptr++;
  428.     if (Ll & mask)
  429.     *ptr = 0x01;
  430.     ptr++;
  431.     mask = 0x000100L;
  432.     if (Rh & mask)
  433.     *ptr = 0x01;
  434.     ptr++;
  435.     if (Lh & mask)
  436.     *ptr = 0x01;
  437.     ptr++;
  438.     mask = 0x100000L;
  439.     if (Rh & mask)
  440.     *ptr = 0x01;
  441.     ptr++;
  442.     if (Lh & mask)
  443.     *ptr = 0x01;
  444.     ptr++;
  445.     mask = 0x000080L;
  446.     if (Rl & mask)
  447.     *ptr = 0x01;
  448.     ptr++;
  449.     if (Ll & mask)
  450.     *ptr = 0x01;
  451.     ptr++;
  452.     mask = 0x080000L;
  453.     if (Rl & mask)
  454.     *ptr = 0x01;
  455.     ptr++;
  456.     if (Ll & mask)
  457.     *ptr = 0x01;
  458.     ptr++;
  459.     mask = 0x000080L;
  460.     if (Rh & mask)
  461.     *ptr = 0x01;
  462.     ptr++;
  463.     if (Lh & mask)
  464.     *ptr = 0x01;
  465.     ptr++;
  466.     mask = 0x080000L;
  467.     if (Rh & mask)
  468.     *ptr = 0x01;
  469.     ptr++;
  470.     if (Lh & mask)
  471.     *ptr = 0x01;
  472.     ptr++;
  473.     mask = 0x000010L;
  474.     if (Rl & mask)
  475.     *ptr = 0x01;
  476.     ptr++;
  477.     if (Ll & mask)
  478.     *ptr = 0x01;
  479.     ptr++;
  480.     mask = 0x010000L;
  481.     if (Rl & mask)
  482.     *ptr = 0x01;
  483.     ptr++;
  484.     if (Ll & mask)
  485.     *ptr = 0x01;
  486.     ptr++;
  487.     mask = 0x000010L;
  488.     if (Rh & mask)
  489.     *ptr = 0x01;
  490.     ptr++;
  491.     if (Lh & mask)
  492.     *ptr = 0x01;
  493.     ptr++;
  494.     mask = 0x010000L;
  495.     if (Rh & mask)
  496.     *ptr = 0x01;
  497.     ptr++;
  498.     if (Lh & mask)
  499.     *ptr = 0x01;
  500.     ptr++;
  501.     mask = 0x000008L;
  502.     if (Rl & mask)
  503.     *ptr = 0x01;
  504.     ptr++;
  505.     if (Ll & mask)
  506.     *ptr = 0x01;
  507.     ptr++;
  508.     mask = 0x008000L;
  509.     if (Rl & mask)
  510.     *ptr = 0x01;
  511.     ptr++;
  512.     if (Ll & mask)
  513.     *ptr = 0x01;
  514.     ptr++;
  515.     mask = 0x000008L;
  516.     if (Rh & mask)
  517.     *ptr = 0x01;
  518.     ptr++;
  519.     if (Lh & mask)
  520.     *ptr = 0x01;
  521.     ptr++;
  522.     mask = 0x008000L;
  523.     if (Rh & mask)
  524.     *ptr = 0x01;
  525.     ptr++;
  526.     if (Lh & mask)
  527.     *ptr = 0x01;
  528.     ptr++;
  529.     mask = 0x000004L;
  530.     if (Rl & mask)
  531.     *ptr = 0x01;
  532.     ptr++;
  533.     if (Ll & mask)
  534.     *ptr = 0x01;
  535.     ptr++;
  536.     mask = 0x004000L;
  537.     if (Rl & mask)
  538.     *ptr = 0x01;
  539.     ptr++;
  540.     if (Ll & mask)
  541.     *ptr = 0x01;
  542.     ptr++;
  543.     mask = 0x000004L;
  544.     if (Rh & mask)
  545.     *ptr = 0x01;
  546.     ptr++;
  547.     if (Lh & mask)
  548.     *ptr = 0x01;
  549.     ptr++;
  550.     mask = 0x004000L;
  551.     if (Rh & mask)
  552.     *ptr = 0x01;
  553.     ptr++;
  554.     if (Lh & mask)
  555.     *ptr = 0x01;
  556.     ptr++;
  557.     mask = 0x000002L;
  558.     if (Rl & mask)
  559.     *ptr = 0x01;
  560.     ptr++;
  561.     if (Ll & mask)
  562.     *ptr = 0x01;
  563.     ptr++;
  564.     mask = 0x002000L;
  565.     if (Rl & mask)
  566.     *ptr = 0x01;
  567.     ptr++;
  568.     if (Ll & mask)
  569.     *ptr = 0x01;
  570.     ptr++;
  571.     mask = 0x000002L;
  572.     if (Rh & mask)
  573.     *ptr = 0x01;
  574.     ptr++;
  575.     if (Lh & mask)
  576.     *ptr = 0x01;
  577.     ptr++;
  578.     mask = 0x002000L;
  579.     if (Rh & mask)
  580.     *ptr = 0x01;
  581.     ptr++;
  582.     if (Lh & mask)
  583.     *ptr = 0x01;
  584.     ptr++;
  585. }
  586.  
  587. char *
  588. fcrypt (pw, salt)
  589.     char *pw;
  590.     char *salt;
  591. {
  592.     /* Table lookups for salts reduce fcrypt() overhead dramatically */
  593.     static sbpb24 salt0[] =
  594.     {
  595.     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  596.     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  597.     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  598.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 5, 6, 7, 8, 9, 10, 11, 12,
  599.     13, 14, 15, 16, 17,
  600.  
  601.     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  602.     32, 33, 34, 35, 36, 37, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
  603.     42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57,
  604.     58, 59, 60, 61, 62, 63, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
  605.     12, 13, 14, 15, 16, 17,
  606.  
  607.     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  608.     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  609.     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  610.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
  611.  
  612.     18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  613.     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  614.     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
  615.     0, 1, 2, 3, 4
  616.     };
  617.     static sbpb24 salt1[] =
  618.     {
  619.     1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
  620.     1728, 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304,
  621.     2368, 2432, 2496, 2560, 2624, 2688, 2752, 2816, 2880, 2944,
  622.     3008, 3072, 3136, 3200, 3264, 3328, 3392, 3456, 3520, 3584,
  623.     3648, 3712, 3776, 3840, 3904, 3968, 4032, 0, 64, 128, 192, 256,
  624.     320, 384, 448, 512, 576, 640, 704, 320, 384, 448, 512, 576, 640,
  625.     704, 768, 832, 896, 960, 1024, 1088,
  626.  
  627.     1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
  628.     1728, 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304,
  629.     2368, 2048, 2112, 2176, 2240, 2304, 2368, 2432, 2496, 2560,
  630.     2624, 2688, 2752, 2816, 2880, 2944, 3008, 3072, 3136, 3200,
  631.     3264, 3328, 3392, 3456, 3520, 3584, 3648, 3712, 3776, 3840,
  632.     3904, 3968, 4032, 0, 64, 128, 192, 256, 320, 384, 448, 512, 576,
  633.     640, 704, 768, 832, 896, 960, 1024, 1088,
  634.  
  635.     1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
  636.     1728, 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304,
  637.     2368, 2432, 2496, 2560, 2624, 2688, 2752, 2816, 2880, 2944,
  638.     3008, 3072, 3136, 3200, 3264, 3328, 3392, 3456, 3520, 3584,
  639.     3648, 3712, 3776, 3840, 3904, 3968, 4032, 0, 64, 128, 192, 256,
  640.     320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024,
  641.     1088,
  642.  
  643.     1152, 1216, 1280, 1344, 1408, 1472, 1536, 1600, 1664,
  644.     1728, 1792, 1856, 1920, 1984, 2048, 2112, 2176, 2240, 2304,
  645.     2368, 2432, 2496, 2560, 2624, 2688, 2752, 2816, 2880, 2944,
  646.     3008, 3072, 3136, 3200, 3264, 3328, 3392, 3456, 3520, 3584,
  647.     3648, 3712, 3776, 3840, 3904, 3968, 4032, 0, 64, 128, 192, 256
  648.     };
  649.  
  650.     /* final perutation desalting */
  651.     static obpb1 final[] =
  652.     {
  653.     46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66,
  654.     67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
  655.     83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103,
  656.     104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116,
  657.     117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
  658.     130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
  659.     143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155,
  660.     156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168,
  661.     169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181,
  662.     182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
  663.     195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
  664.     208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
  665.     221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233,
  666.     234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246,
  667.     247, 248, 249, 250, 251, 252, 253, 254, 255,
  668.     /* Truncate overflow bits at 256 */
  669.     0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  670.     16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
  671.     32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
  672.     48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58
  673.     };
  674.  
  675.     reg int i, j, k;
  676.     reg long int *lip;
  677.     sbpb24 saltvalue;
  678.  
  679. #ifdef BUILTIN_CLEAR
  680.     lip = (long int *) crypt_block;
  681.     for (i = (sizeof (crypt_block) / sizeof (long int)); i--; /* - */ )
  682.     {
  683.     *(lip++) = 0L;
  684.     }
  685. #else                /* BUILTIN_CLEAR */
  686.  /*   bzero (crypt_block, 66); */
  687.     memset(crypt_block, 0, 66);
  688. #endif                /* BUILTIN_CLEAR */
  689.  
  690.     for (i = 0; (k = *pw) && i < 64; pw++)
  691.     {
  692.     crypt_block[i++] = (k >> 6) & 01;
  693.     crypt_block[i++] = (k >> 5) & 01;
  694.     crypt_block[i++] = (k >> 4) & 01;
  695.     crypt_block[i++] = (k >> 3) & 01;
  696.     crypt_block[i++] = (k >> 2) & 01;
  697.     crypt_block[i++] = (k >> 1) & 01;
  698.     crypt_block[i++] = (k >> 0) & 01;
  699.     i++;            /* have to skip one here (parity bit) */
  700.     }
  701.  
  702.     fsetkey ( /* crypt_block */ );
  703.  
  704. #ifdef BUILTIN_CLEAR
  705.     lip = (long int *) crypt_block;
  706.     for (i = (sizeof (crypt_block) / sizeof (long int)); i--; /* - */ )
  707.     {
  708.     *(lip++) = 0L;
  709.     }
  710. #else                /* BUILTIN_CLEAR */
  711.     memset(crypt_block, 0, 66);
  712.     /* bzero (crypt_block, 66); */
  713. #endif                /* BUILTIN_CLEAR */
  714.  
  715.     iobuf[0] = salt[0];
  716.     iobuf[1] = salt[1];
  717.  
  718.     saltvalue = salt0[iobuf[0]] | salt1[iobuf[1]];
  719.     saltvalue = TF_TO_SIXBIT (saltvalue);
  720.  
  721.     XForm (saltvalue);
  722.     UnXForm ();
  723.  
  724.     for (i = 0; i < 11; i++)
  725.     {
  726.     k = 0;
  727.  
  728.     for (j = 0; j < 6; j++)
  729.     {
  730.         k = (k << 1) | crypt_block[SIX_TIMES (i) + j];
  731.     }
  732.     iobuf[i + 2] = final[k];
  733.     }
  734.  
  735.     iobuf[i + 2] = 0;
  736.  
  737.     if (iobuf[1] == 0)
  738.     {
  739.     iobuf[1] = iobuf[0];
  740.     }
  741.     return (iobuf);
  742. }
  743. /********* INITIALISATION ROUTINES *********/
  744.  
  745. fbpb4
  746. lookupS (tableno, t6bits)
  747.     unsl tableno;
  748.     sbpb6R t6bits;
  749. {
  750.     static fbpb4R S[8][64] =
  751.     {
  752.     14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
  753.     0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
  754.     4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
  755.     15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
  756.  
  757.     15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
  758.     3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
  759.     0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
  760.     13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
  761.  
  762.     10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
  763.     13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
  764.     13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
  765.     1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
  766.  
  767.     7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
  768.     13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
  769.     10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
  770.     3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
  771.  
  772.     2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
  773.     14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
  774.     4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
  775.     11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
  776.  
  777.     12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
  778.     10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
  779.     9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
  780.     4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
  781.  
  782.     4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
  783.     13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
  784.     1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
  785.     6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
  786.  
  787.     13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
  788.     1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
  789.     7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
  790.     2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
  791.     };
  792.     sbpb6 fixed6bits;
  793.     fbpb4R r;
  794.     fbpb4 fixedr;
  795.  
  796.     fixed6bits = (((t6bits >> 0) & 01) << 5) +
  797.     (((t6bits >> 1) & 01) << 3) +
  798.     (((t6bits >> 2) & 01) << 2) +
  799.     (((t6bits >> 3) & 01) << 1) +
  800.     (((t6bits >> 4) & 01) << 0) +
  801.     (((t6bits >> 5) & 01) << 4);
  802.  
  803.     r = S[tableno][fixed6bits];
  804.  
  805.     fixedr = (((r >> 3) & 01) << 0) +
  806.     (((r >> 2) & 01) << 1) +
  807.     (((r >> 1) & 01) << 2) +
  808.     (((r >> 0) & 01) << 3);
  809.  
  810.     return (fixedr);
  811. }
  812.  
  813. void
  814. init (tableno, lowptr, highptr)
  815.     unsl tableno;
  816.     sbpb24 *lowptr, *highptr;
  817. {
  818.  
  819.     static unsb P[] =
  820.     {
  821.     15, 6, 19, 20,
  822.     28, 11, 27, 16,
  823.     0, 14, 22, 25,
  824.     4, 17, 30, 9,
  825.     1, 7, 23, 13,
  826.     31, 26, 2, 8,
  827.     18, 12, 29, 5,
  828.     21, 10, 3, 24,
  829.     };
  830.  
  831.     static unsb E[] =
  832.     {
  833.     31, 0, 1, 2, 3, 4,
  834.     3, 4, 5, 6, 7, 8,
  835.     7, 8, 9, 10, 11, 12,
  836.     11, 12, 13, 14, 15, 16,
  837.     15, 16, 17, 18, 19, 20,
  838.     19, 20, 21, 22, 23, 24,
  839.     23, 24, 25, 26, 27, 28,
  840.     27, 28, 29, 30, 31, 0,
  841.     };
  842.  
  843.     static obpb1 tmp32[32];
  844.     static obpb1 tmpP32[32];
  845.     static obpb1 tmpE[48];
  846.  
  847.     int j, k, i;
  848.     int tablenoX4;
  849.     reg sbpb24 spare24;
  850.  
  851.     tablenoX4 = tableno * 4;
  852.  
  853.     for (j = 0; j < 64; j++)
  854.     {
  855.     k = lookupS (tableno, j);
  856.  
  857.     for (i = 0; i < 32; i++)
  858.     {
  859.         tmp32[i] = 0;
  860.     }
  861.  
  862.     for (i = 0; i < 4; i++)
  863.     {
  864.         tmp32[tablenoX4 + i] = (k >> i) & 01;
  865.     }
  866.  
  867.     for (i = 0; i < 32; i++)
  868.     {
  869.         tmpP32[i] = tmp32[P[i]];
  870.     }
  871.  
  872.     for (i = 0; i < 48; i++)
  873.     {
  874.         tmpE[i] = tmpP32[E[i]];
  875.     }
  876.  
  877.     lowptr[j] = 0L;
  878.     highptr[j] = 0L;
  879.  
  880.     for (i = 0; i < 24; i++)
  881.     {
  882.         lowptr[j] |= (unsigned long) tmpE[i] << i;
  883.     }
  884.  
  885.     for (k = 0, i = 24; i < 48; i++, k++)
  886.     {
  887.         highptr[j] |= (unsigned long) tmpE[i] << k;
  888.     }
  889.  
  890.     spare24 = lowptr[j];    /* to allow for macro expansion */
  891.     lowptr[j] = TF_TO_SIXBIT (spare24);
  892.  
  893.     spare24 = highptr[j];    /* to allow for macro expansion */
  894.     highptr[j] = TF_TO_SIXBIT (spare24);
  895.     }
  896. }
  897.  
  898.  
  899. int
  900. init_des ()
  901. {
  902.     init (0L, S0L, S0H);
  903.     init (1L, S1L, S1H);
  904.     init (2L, S2L, S2H);
  905.     init (3L, S3L, S3H);
  906.     init (4L, S4L, S4H);
  907.     init (5L, S5L, S5H);
  908.     init (6L, S6L, S6H);
  909.     init (7L, S7L, S7H);
  910.     return (0);
  911. }
  912.